// 通过一个通用的字符串来辨识联合类型具体是哪一个类型
interface Square {
  kind: 's';
  width: number;
}

interface Rectangle {
  kind: 'r';
  width: number;
  height: number;
}

interface Circle {
  kind: 'c',
  radius: number;
}

type Shape = Square | Circle | Rectangle

function area(s: Shape): number {
  switch (s.kind) {
    case 's': return s.width ** 2
    case 'r': return s.width * s.height
    case "c": return s.radius ** 2 * Math.PI
  }
}